package base_03_string;


/**
 * String深度解析
 * <pre>
 * String不可变原因：
 *  String是final修饰的不能被继承修改
 *  String底层是char数组（java9之后使用byte数组），该变量是private final修饰的且String没有对外暴露可修改数组的方法
 * @author <a href="mailto:sjj@jianzhimao.com">mojo</a>
 * copyright (C), 2013-2022, 广州九尾信息科技有限公司
 * @date 2022/2/18 17:25
 */
public class StringDemo {
    public static void main(String[] args) {
        //将s1对象引用放入常量池中
        String s1 = "1";
        //会判断常量池中是否存在“1”的引用，如果不存在首先会在常量池中创建并保存。然后在堆中创建
        final String ss = new String("1");
        String s2 = "1";
        System.out.println(ss == s1);//false
        System.out.println(s2 == s1);//true
        //====================================================================
        String ss1 = "常量池";
        String ss2 = "常量池";
        String ss3 = ss1.intern();
        System.out.println("ss1==ss2:" + (ss1 == ss2));//true
        System.out.println("ss1==ss3:" + (ss1 == ss3));//true
        //====================================================================
        System.out.println("=============================================");
        //String 类型的变量和常量做“+”运算时发生了什么？
        String str1 = "str";
        String str2 = "ing";
        String str3 = "str" + "ing";
        String str4 = str1 + str2;
        String str5 = "string";
        System.out.println(str3 == str4);//false,如果str1,str2是final类型，则为true,都是常量，编译期能确认值，
        System.out.println(str3 == str5);//true
        System.out.println(str4 == str5);//false,如果str1,str2是final类型，则为true,都是常量，编译期能确认值，
        System.out.println("=============================================");
        final String str11 = "str";
        final String str22 = "ing";
        // 下面两个表达式其实是等价的
        String c = "str" + "ing";// 常量池中的对象
        String d = str11 + str22; // 常量池中的对象
        System.out.println(c == d);// true

        //ss3.intern();
        String ss5 = "11";
        //System.out.println(ss4 == ss5);
    }

    //intern方法示例
    public void internTest() {

    }
}
